#ifndef LINKED_LIST_H
#define LINKED_LIST_H

#include <stdint.h>

typedef uint32_t size_t;

// 定义链表节点结构体
typedef struct ListNode {
    void *data;          // 数据指针
    char *name;          // 数据名称
    struct ListNode *next; // 指向下一个节点的指针
} ListNode;

// 定义链表表头结构体
typedef struct ListHead {
    ListNode *head;      // 第一个节点的地址
    size_t count;        // 链表节点个数
} ListHead;

// 创建一个链表
void ListCreate(ListHead *list);

// 向链表尾部添加数据
void ListPushBack(ListHead *list, void *data, const char *name);

// 向链表头部添加数据
void ListPushFront(ListHead *list, void *data, const char *name);

// 按位置插入数据
void ListInsert(ListHead *list, size_t position, void *data, const char *name);

// 给定结点插入数据，插入到结点前
void ListInsertForNode(ListHead *list, ListNode *node, void *data, const char *name);

// 从链表尾部删除数据
void ListEraseBack(ListHead *list);

// 从链表头部删除数据
void ListEraseFront(ListHead *list);

// 删除给定结点
void ListEraseForNode(ListHead *list, ListNode *node);

// 获取头结点
ListNode* ListGetHead(ListHead *list);

// 获取尾结点
ListNode* ListGetTail(ListHead *list);

// 获取指定位置的结点
ListNode* ListGetNode(ListHead *list, size_t position);

// 获取指定结点的下一个结点
ListNode* ListGetNodeNext(ListNode *node);

// 销毁链表
void ListDestroy(ListHead *list);

#endif // LINKED_LIST_H